package com.android2024.no6_music;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.util.Log;

import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

/*****************************************************************************
 * 封装权限功能
 */
public class JwPermissions {

    /*******************************************************
     *动态申请SD卡权限
     * @param iContext 上下文句柄
     * @param reqid 请求码
     */
    //常用系统权限
    /******************************************************
     * Manifest.permission.READ_EXTERNAL_STORAGE  外部存储卡读
     * Manifest.permission.WRITE_EXTERNAL_STORAGE  外部存储卡写
     * Manifest.permission.ACCESS_CHECKIN_PROPERTIES  允许在登入数据库的时候读写其中的属性表，并上传改变的值
     * Manifest.permission.ACCESS_COARSE_LOCATION  允许应用访问范围(如WIFI)性的定位
     * Manifest.permission.ACCESS_FINE_LOCATION  允许应用访问精确(如GPS)性的定位
     * Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS  允许应访问额外的提供定位的指令
     * Manifest.permission.ACCESS_MOCK_LOCATION  允许应用创建用于测试的模拟定位提供者
     * Manifest.permission.ACCESS_NETWORK_STATE  允许应用访问网络上的信息
     * Manifest.permission.ACCESS_SURFACE_FLINGER  允许应用使用低版本视图的特征
     * Manifest.permission.ACCESS_WIFI_STATE  允许应用访问关羽Wi-Fi网络的信息
     * Manifest.permission.ACCOUNT_MANAGER  允许应用进入帐户认证
     * Manifest.permission.AUTHENTICATE_ACCOUNTS  允许应用为ACCOUNT_MANAGER扮演一个帐户认证系统
     * Manifest.permission.BATTERY_STATS  允许应用去统计电源信息
     * Manifest.permission.BIND_APPWIDGET  允许应用告诉AppWidget哪个应用能够访问该AppWidget的数据
     * Manifest.permission.BIND_DEVICE_ADMIN  必须通过关机接收者的请求来确保只有系统能够与之交互
     * Manifest.permission.BIND_INPUT_METHOD  必须通过InputMethodService的请求来确保只有系统能够与之绑定
     * Manifest.permission.BIND_WALLPAPER  必须通过WallpaperService的请求来确保只有系统能够与之绑定
     * Manifest.permission.BLUETOOTH  允许应用去连接蓝牙设备
     * Manifest.permission.BLUETOOTH_ADMIN  允许应用找到与之连接的蓝牙设备
     * Manifest.permission.BRICK  被请求废止设备(非常危险)
     * Manifest.permission.BROADCAST_PACKAGE_REMOVED  允许应用发出一个程序包被移除的广播消息
     * Manifest.permission.BROADCAST_SMS  允许应用发出一个收到短信的消息
     * Manifest.permission.BROADCAST_STICKY  允许应用发出一个与intent相连的消息
     * Manifest.permission.BROADCAST_WAP_PUSH  允许应用发出一个收到WAP PUSH的广播消息
     * Manifest.permission.CALL_PHONE  允许应用启动一个用户确认电话被拨打而不通过拨打电话的用户界面的的拨打程序
     * Manifest.permission.CALL_PRIVILEGED  允许应用启动一个用户确认电话被拨打而不通过拨打电话的用户界面的的任意号码的拨打，包括紧急号码.
     * Manifest.permission.CAMERA  能够启动照相机设备的请求
     * Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE  允许应用去改变一个应用是否是激活状态
     * Manifest.permission.CHANGE_CONFIGURATION  允许应用修改当前的配置，如本地设置
     * Manifest.permission.CHANGE_NETWORK_STATE  允许应用改变网络的连接状态
     * CHANGE_WIFI_MULTICAST_STATE  允许应用进入Wi-Fi的组播方式
     * CHANGE_WIFI_STATE  允许应用改变Wi-Fi的连接状态
     * CLEAR_APP_CACHE  允许应用清除所有安装在设备上的应用的缓存
     * CLEAR_APP_USER_DATA  允许应用清除使用者的信息资料
     * CONTROL_LOCATION_UPDATES  允许从广播设备来更新或不更新本地的消息
     * DELETE_CACHE_FILES  允许应用删除掉缓存文件
     * DELETE_PACKAGES  允许应用删除掉程序包
     * DEVICE_POWER  允许低权限的访问电源管理项
     * DIAGNOSTIC  允许应用诊断程序资源
     * DISABLE_KEYGUARD  允许应用禁用键盘锁
     * DUMP  允许应用从系统服务中恢复转储的信息
     * EXPAND_STATUS_BAR  允许应用扩大或缩小状态栏
     * FACTORY_TEST  如制造商测试的应用一样用终极权限用户运行
     * FLASHLIGHT  允许访问手电筒
     * FORCE_BACK  允许应用强制的返回操作而不论是不是最终的activity
     * GET_ACCOUNTS  允许应用访问账目服务中的统计清单
     * GET_PACKAGE_SIZE  允许应用查找出任何程序包使用的空间
     * GET_TASKS  允许应用找到关于当前或最近运行的任务和在哪些acitivities里运行
     * GLOBAL_SEARCH  这个权限可以被内容提供者用来允许使用全程搜索他们的数据
     * HARDWARE_TEST  允许访问硬件及周边设备.
     * INJECT_EVENTS  允许应用注入用户事件（键盘、触摸）到事件中然后提供给任意的窗口
     * INSTALL_LOCATION_PROVIDER 允许应用安装一个位置提供商到位置管理器中
     * INSTALL_PACKAGES  允许应用安装程序包.
     * INTERNAL_SYSTEM_WINDOW  允许应用打开被部分系统用户接口使用的窗口
     * INTERNET  允许应用打开网络套接口
     * KILL_BACKGROUND_PROCESSES  允许应用去呼叫killBackgroundProcesses(String).方法
     * MANAGE_ACCOUNTS  允许应用去管理帐户管理者中的重要清单
     * MANAGE_APP_TOKENS  允许应用去管理(创建、销毁、顺序)在窗口管理者中的应用
     * MASTER_CLEAR
     *
     */


    /***************************************************
     * 判断是否有存在的权限
     * @param iContext
     * @return true 权限未分配 false 权限已分配
     */
    static public boolean isHavePermissions(Context iContext,String[] permArr)
    {
        boolean needReq = false;
        for(int i=0;i<permArr.length;i++){
            if(ContextCompat.checkSelfPermission(iContext, permArr[i])!= PackageManager.PERMISSION_GRANTED){
                needReq = true;
                break;
            }
        }
        return needReq;
    }

    /******************************************
     * 代码动态申请权限
     * @param iContext
     * @param reqid
     */
    static public  void permissions(Context iContext,int reqid,String[] permArr)
    {
        if(isHavePermissions(iContext,permArr)==true) {
            ActivityCompat.requestPermissions((Activity) iContext, permArr, reqid);
        }
    }

    /**********************************
     * 权限提示框
     */
    static public void showNormalDialog(Context iContext){
        /* @setIcon 设置对话框图标
         * @setTitle 设置对话框标题
         * @setMessage 设置对话框消息提示
         * setXXX方法返回Dialog对象，因此可以链式设置属性
         */
        final AlertDialog.Builder normalDialog =
                new AlertDialog.Builder(iContext);
        normalDialog.setTitle("权限提示");
        normalDialog.setMessage("程序存储权限未允许，程序部分功能无法使用");
        normalDialog.setPositiveButton("允许",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //...To-do
                        //跳转系统设置权限界面
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", iContext.getPackageName(), null);
                        intent.setData(uri);
                        iContext.startActivity(intent);
                    }
                });
        normalDialog.setNegativeButton("关闭",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //...To-do
                    }
                });
        // 显示
        normalDialog.show();
    }
}
